using System;
using System.Collections.Generic;
using NHibernate;
using NHibernate.Criterion;
using PortalFolia.Data.Objetos;
using PortalFolia.IRepositorio;

namespace PortalFolia.Repositorio
{
    public class RepositorioUsuario : IRepositorioUsuario
    {
        public Usuario Inserir(Usuario usuario)
        {
            GerenciadorBD.Instance.SessaoAtual().Save(usuario);
            return usuario;
        }

        public Usuario Atualizar(Usuario usuario)
        {
            Usuario tmpUsuario = ObterPorId(usuario.UsuarioId);

            // Atribuicao dos valores do objeto da memoria para o objeto obtido no banco de dados

            GerenciadorBD.Instance.SessaoAtual().Update(tmpUsuario);
            return tmpUsuario;
        }

        public void Excluir(Usuario usuario)
        {
            GerenciadorBD.Instance.SessaoAtual().Delete(usuario);
        }

        public IList<Usuario> ObterTodos()
        {
            ICriteria criteria = GerenciadorBD.Instance.SessaoAtual().CreateCriteria(typeof(Usuario));
            return criteria.List<Usuario>() as List<Usuario>;
        }

        public Usuario ObterPorId(int id)
        {
            return GerenciadorBD.Instance.SessaoAtual().Get<Usuario>(id);
        }

        public bool VerificarLogin(string login)
        {
            bool verificado = true;

            ICriteria criteria = GerenciadorBD.Instance.SessaoAtual().CreateCriteria(typeof(Usuario))
                .Add(Restrictions.Eq("Login", login));

            if ((criteria.UniqueResult() as Usuario) != null)
            {
                verificado = false;
            }

            return verificado;
        }

        public bool VerificarEmail(string email)
        {
            bool verificado = true;

            ICriteria criteria = GerenciadorBD.Instance.SessaoAtual().CreateCriteria(typeof(Usuario))
                .Add(Restrictions.Eq("Email", email));

            if ((criteria.UniqueResult() as Usuario) != null)
            {
                verificado = false;
            }

            return verificado;
        }

        public Usuario Logar(string nomeUsuario)
        {
            ICriteria criteria = GerenciadorBD.Instance.SessaoAtual().CreateCriteria(typeof (Usuario))
                .Add(Restrictions.Eq("Login", nomeUsuario));

            return criteria.UniqueResult() as Usuario;
        }

        public Usuario ObterUsuarioPorEmail(string email)
        {
            ICriteria criteria = GerenciadorBD.Instance.SessaoAtual().CreateCriteria(typeof(Usuario))
                 .Add(Restrictions.Eq("Email", email));

            return criteria.UniqueResult() as Usuario;
        }
    }
}